{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 调整树的参数：max_depth & min_child_weight\n",
    "(粗调，参数的步长为2；下一步是在粗调最佳参数周围，将步长降为1，进行精细调整)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "# train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['interest_level']\n",
    "\n",
    "train = train.drop(['interest_level'], axis=1, inplace = False)\n",
    "X_train = train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 训练样本6w+，交叉验证太慢，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.2,random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(9870, 227)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_part.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一轮参数调整得到的n_estimators最优值（104），其余参数继续默认值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': range(4, 10, 2), 'min_child_weight': range(1, 6, 2)}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = range(4,10,2)\n",
    "min_child_weight = range(1,6,2)\n",
    "param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n",
       "       colsample_bytree=0.8, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
       "       max_depth=6, min_child_weight=1, missing=None, n_estimators=104,\n",
       "       n_jobs=1, nthread=None, objective='multi:softprob', random_state=0,\n",
       "       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=5, silent=True,\n",
       "       subsample=0.5),\n",
       "       fit_params=None, iid=True, n_jobs=-1,\n",
       "       param_grid={'max_depth': range(4, 10, 2), 'min_child_weight': range(1, 6, 2)},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=104,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=6,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.5,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=5)\n",
    "\n",
    "\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid = param_test2_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_1.fit(X_train_part , y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.62779, std: 0.00678, params: {'max_depth': 4, 'min_child_weight': 1},\n",
       "  mean: -0.62753, std: 0.00768, params: {'max_depth': 4, 'min_child_weight': 3},\n",
       "  mean: -0.62724, std: 0.00676, params: {'max_depth': 4, 'min_child_weight': 5},\n",
       "  mean: -0.62800, std: 0.00982, params: {'max_depth': 6, 'min_child_weight': 1},\n",
       "  mean: -0.62656, std: 0.00769, params: {'max_depth': 6, 'min_child_weight': 3},\n",
       "  mean: -0.62745, std: 0.00743, params: {'max_depth': 6, 'min_child_weight': 5},\n",
       "  mean: -0.63844, std: 0.00790, params: {'max_depth': 8, 'min_child_weight': 1},\n",
       "  mean: -0.63283, std: 0.00713, params: {'max_depth': 8, 'min_child_weight': 3},\n",
       "  mean: -0.63024, std: 0.00915, params: {'max_depth': 8, 'min_child_weight': 5}],\n",
       " {'max_depth': 6, 'min_child_weight': 3},\n",
       " -0.6265610097718766)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_1.grid_scores_, gsearch2_1.best_params_,     gsearch2_1.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 53.36863089,  57.99485874,  55.60725169,  78.40287075,\n",
       "         80.11843796,  81.10234604, 103.69420934,  93.29243503,\n",
       "         85.12209129]),\n",
       " 'std_fit_time': array([4.33577002, 2.73133889, 0.53448386, 1.45770933, 2.55293116,\n",
       "        2.28795437, 5.48281821, 0.35807579, 8.81910657]),\n",
       " 'mean_score_time': array([0.1047204 , 0.11209998, 0.12406826, 0.15319047, 0.14581027,\n",
       "        0.16057134, 0.18710017, 0.16615648, 0.13663445]),\n",
       " 'std_score_time': array([0.00716441, 0.02201901, 0.03378877, 0.01236951, 0.01107608,\n",
       "        0.02287407, 0.01683827, 0.00491102, 0.02227399]),\n",
       " 'param_max_depth': masked_array(data=[4, 4, 4, 6, 6, 6, 8, 8, 8],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_min_child_weight': masked_array(data=[1, 3, 5, 1, 3, 5, 1, 3, 5],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'max_depth': 4, 'min_child_weight': 1},\n",
       "  {'max_depth': 4, 'min_child_weight': 3},\n",
       "  {'max_depth': 4, 'min_child_weight': 5},\n",
       "  {'max_depth': 6, 'min_child_weight': 1},\n",
       "  {'max_depth': 6, 'min_child_weight': 3},\n",
       "  {'max_depth': 6, 'min_child_weight': 5},\n",
       "  {'max_depth': 8, 'min_child_weight': 1},\n",
       "  {'max_depth': 8, 'min_child_weight': 3},\n",
       "  {'max_depth': 8, 'min_child_weight': 5}],\n",
       " 'split0_test_score': array([-0.63158882, -0.63191701, -0.63056926, -0.63014684, -0.6296444 ,\n",
       "        -0.63307357, -0.64407177, -0.63833771, -0.63853069]),\n",
       " 'split1_test_score': array([-0.63923029, -0.63942545, -0.63849692, -0.64534538, -0.63873418,\n",
       "        -0.6390911 , -0.64913274, -0.63980137, -0.64175903]),\n",
       " 'split2_test_score': array([-0.62387099, -0.62511891, -0.62395668, -0.62464369, -0.62266285,\n",
       "        -0.6209849 , -0.63403542, -0.62222698, -0.62413198]),\n",
       " 'split3_test_score': array([-0.62053885, -0.61660589, -0.61875409, -0.61576164, -0.61546965,\n",
       "        -0.61998335, -0.62632326, -0.62634648, -0.61682797]),\n",
       " 'split4_test_score': array([-0.62373218, -0.62456508, -0.62444223, -0.62409203, -0.62629226,\n",
       "        -0.62411153, -0.63862426, -0.63742164, -0.62995798]),\n",
       " 'mean_test_score': array([-0.62779302, -0.62752722, -0.62724446, -0.62799853, -0.62656101,\n",
       "        -0.6274498 , -0.63843804, -0.63282693, -0.6302424 ]),\n",
       " 'std_test_score': array([0.00677811, 0.00767715, 0.00675903, 0.00981611, 0.00769395,\n",
       "        0.00742757, 0.00790338, 0.00713418, 0.00915127]),\n",
       " 'rank_test_score': array([5, 4, 2, 6, 1, 3, 9, 8, 7]),\n",
       " 'split0_train_score': array([-0.53063555, -0.53651852, -0.54094488, -0.39657571, -0.41969232,\n",
       "        -0.43278047, -0.25533767, -0.30917059, -0.3431575 ]),\n",
       " 'split1_train_score': array([-0.52730969, -0.53404566, -0.53760494, -0.40112064, -0.42254965,\n",
       "        -0.43838701, -0.26361596, -0.3142886 , -0.3406122 ]),\n",
       " 'split2_train_score': array([-0.53205718, -0.53661469, -0.54239959, -0.39901074, -0.42444264,\n",
       "        -0.43951851, -0.26333396, -0.31237337, -0.34411669]),\n",
       " 'split3_train_score': array([-0.53283523, -0.5403581 , -0.54414695, -0.40018721, -0.42546408,\n",
       "        -0.44308485, -0.25937981, -0.31072177, -0.34553924]),\n",
       " 'split4_train_score': array([-0.53298033, -0.54009114, -0.54430987, -0.4032985 , -0.4214857 ,\n",
       "        -0.44060765, -0.25726237, -0.30976592, -0.34370155]),\n",
       " 'mean_train_score': array([-0.5311636 , -0.53752562, -0.54188125, -0.40003856, -0.42272688,\n",
       "        -0.4388757 , -0.25978596, -0.31126405, -0.34342544]),\n",
       " 'std_train_score': array([0.0020988 , 0.00238994, 0.00246835, 0.00223016, 0.00205993,\n",
       "        0.00342112, 0.00327347, 0.00186008, 0.00161297])}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_1.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: 0.626561 using {'max_depth': 6, 'min_child_weight': 3}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (-gsearch2_1.best_score_, gsearch2_1.best_params_))\n",
    "test_means = gsearch2_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_1.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(min_child_weight):\n",
    "    pyplot.plot(max_depth, -test_scores[i], label= 'test_min_child_weight:'   + str(value))\n",
    "# for i, value in enumerate(min_child_weight):\n",
    "#     pyplot.plot(max_depth, -train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_1.png' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "当前调参结果：  \n",
    "最优max_depth为6；   \n",
    "最优min_child_weight为3。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
